
// 购物车模块
const cart = {
  namespaced: true,
  // 存数据
  state: () => ({
    list: []
  }),
  // 该数据
  mutations: {
    // 添加购物车
    insertCart (state, good) {
      // 加入前做判断
      // 如果添加的商品skuid和之前完全一致 ，只做数量添加 ，否则添加新项
      // 数组查找 ： find（如果想要操作数据） findIndex（删除）
      const item = state.list.find(item => item.skuId === good.skuId)
      if (item) {
        // 做数量叠加
        item.count = item.count + good.count
      } else {
        // 把当前的good添加入list
        state.list.unshift(good)
      }
    },
    // 删除购物车
    delCart (state, good) {
      // 删除逻辑
      const index = state.list.findIndex(item => item.skuId === good.skuId)
      state.list.splice(index, 1)
    },
    singCheck (state, { good, selected }) {
      // 通过 good skuId 找到操作项
      const item = state.list.find(item => item.skuId === good.skuId)
      item.selected = selected
    },
    allCheck (state, checked) {
      state.list.forEach(item => {
        item.checked = checked
      })
    },
    changeNum (state, { good, num }) {
      // 通过 good skuId 找到操作项
      const item = state.list.find(item => item.skuId === good.skuId)
      item.count = num
    }

  },
  // 异步
  actions: {
    getInsertCart (ctx, good) {
      // 区分登录和非登录
      // 想通过dispatch（）.then()
      // 好处有两个：一个是操作逻辑收敛 登录（异步） 非登录（同步） 都可以调用同一个action
      // 封装成return Promise 后 可以在业务组件中 dispatch（）。then()
      return new Promise((resolve, reject) => {
        // 登录
        if (ctx.rootState.user.profile.token) {

        } else {
          // 非登录
          ctx.commit('insertCart', good)
          resolve()
        }
      })
    },
    getDelCart (ctx, good) {
      return new Promise((resolve, reject) => {
        // 登录
        if (ctx.rootState.user.profile.token) {

        } else {
          // 非登录
          ctx.commit('delCart', good)
          resolve()
        }
      })
    },
    setSingCheck (ctx, { good, selected }) {
      return new Promise((resolve, reject) => {
        // 登录
        if (ctx.rootState.user.profile.token) {

        } else {
          // 非登录
          ctx.commit('singCheck', { good, selected })
          resolve()
        }
      })
    },
    setAllCheck (ctx, checked) {
      return new Promise((resolve, reject) => {
        // 登录
        if (ctx.rootState.user.profile.token) {

        } else {
          // 非登录
          ctx.commit('allCheck', checked)
          resolve()
        }
      })
    },
    setChangeNum (ctx, { good, num }) {
      return new Promise((resolve, reject) => {
        // 登录
        if (ctx.rootState.user.profile.token) {

        } else {
          // 非登录
          ctx.commit('changeNum', { good, num })
          resolve()
        }
      })
    }
  },
  // 计算属性
  getters: {
    // 计算有效商品列表 isEffective = true
    effectiveList (state) {
      return state.list.filter(item => item.isEffective)
    },
    // 有效商品总数 把effectiveList 中的每一项count起来
    allCount (state, getters) {
      return getters.effectiveList.reduce((a, c) => a + c.count, 0)
    },
    // 总钱数 = 所有单项钱数  单项钱数 = 数量*单机
    allPrice (state, getters) {
      return getters.effectiveList.reduce((a, c) => a + c.count * c.nowPrice, 0)
    },
    // 已选中商品
    selectedList (state) {
      return state.list.filter(item => item.selected)
    },
    // 已选中总钱数
    allSelectedPrice (state, getters) {
      return getters.selectedList.reduce((a, c) => a + c.count * c.nowPrice, 0)
    },
    // 全选 ：有效列表 中的 selected 全为true 才是true
    isAll (state, getters) {
      return getters.effectiveList.every(item => item.selected)
    }

  }
}

export default cart
